<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vQ8GHJQgFyFDHLEXy3oHvHeW0Vq5IZkoDM5QYWn_w5FvwtXA4sjfq2fPiGsC01RDFBaHqLWVulIFBz-/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call - May 27th 2021</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call - May 27th 2021</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">ul.lst-kix_km6g891sw9fl-0{list-style-type:none}ul.lst-kix_km6g891sw9fl-2{list-style-type:none}ul.lst-kix_km6g891sw9fl-1{list-style-type:none}ul.lst-kix_wfjgsg7y1pv8-5{list-style-type:none}ul.lst-kix_wfjgsg7y1pv8-4{list-style-type:none}ul.lst-kix_wfjgsg7y1pv8-3{list-style-type:none}ul.lst-kix_wfjgsg7y1pv8-2{list-style-type:none}ul.lst-kix_wfjgsg7y1pv8-1{list-style-type:none}.lst-kix_f9srltrb74ot-4>li:before{content:"\0025cb  "}ul.lst-kix_wfjgsg7y1pv8-0{list-style-type:none}.lst-kix_f9srltrb74ot-5>li:before{content:"\0025a0  "}.lst-kix_f9srltrb74ot-6>li:before{content:"\0025cf  "}ul.lst-kix_wfjgsg7y1pv8-8{list-style-type:none}ul.lst-kix_wfjgsg7y1pv8-7{list-style-type:none}.lst-kix_f9srltrb74ot-7>li:before{content:"\0025cb  "}ul.lst-kix_wfjgsg7y1pv8-6{list-style-type:none}ul.lst-kix_3dfdewudjmsj-8{list-style-type:none}ul.lst-kix_3dfdewudjmsj-7{list-style-type:none}.lst-kix_gwuc1w3b5m0s-2>li:before{content:"\0025a0  "}.lst-kix_gwuc1w3b5m0s-3>li:before{content:"\0025cf  "}.lst-kix_gwuc1w3b5m0s-4>li:before{content:"\0025cb  "}.lst-kix_f9srltrb74ot-3>li:before{content:"\0025cf  "}.lst-kix_f9srltrb74ot-2>li:before{content:"\0025a0  "}.lst-kix_gwuc1w3b5m0s-6>li:before{content:"\0025cf  "}.lst-kix_gwuc1w3b5m0s-5>li:before{content:"\0025a0  "}.lst-kix_gwuc1w3b5m0s-7>li:before{content:"\0025cb  "}.lst-kix_f9srltrb74ot-0>li:before{content:"\0025cf  "}.lst-kix_f9srltrb74ot-1>li:before{content:"\0025cb  "}ul.lst-kix_3dfdewudjmsj-4{list-style-type:none}ul.lst-kix_3dfdewudjmsj-3{list-style-type:none}ul.lst-kix_3dfdewudjmsj-6{list-style-type:none}ul.lst-kix_3dfdewudjmsj-5{list-style-type:none}ul.lst-kix_3dfdewudjmsj-0{list-style-type:none}.lst-kix_gwuc1w3b5m0s-8>li:before{content:"\0025a0  "}ul.lst-kix_3dfdewudjmsj-2{list-style-type:none}ul.lst-kix_3dfdewudjmsj-1{list-style-type:none}.lst-kix_3mekn7i9tqyg-7>li:before{content:"\0025cb  "}.lst-kix_3mekn7i9tqyg-8>li:before{content:"\0025a0  "}.lst-kix_jcuik66chbv9-5>li:before{content:"\0025a0  "}.lst-kix_jcuik66chbv9-6>li:before{content:"\0025cf  "}ul.lst-kix_gwuc1w3b5m0s-2{list-style-type:none}.lst-kix_jcuik66chbv9-3>li:before{content:"\0025cf  "}.lst-kix_jcuik66chbv9-4>li:before{content:"\0025cb  "}.lst-kix_jcuik66chbv9-7>li:before{content:"\0025cb  "}.lst-kix_jcuik66chbv9-8>li:before{content:"\0025a0  "}ul.lst-kix_gwuc1w3b5m0s-1{list-style-type:none}ul.lst-kix_gwuc1w3b5m0s-0{list-style-type:none}.lst-kix_km6g891sw9fl-2>li:before{content:"\0025a0  "}.lst-kix_3mekn7i9tqyg-4>li:before{content:"\0025cb  "}ul.lst-kix_f9srltrb74ot-0{list-style-type:none}.lst-kix_km6g891sw9fl-3>li:before{content:"\0025cf  "}ul.lst-kix_f9srltrb74ot-3{list-style-type:none}.lst-kix_km6g891sw9fl-4>li:before{content:"\0025cb  "}.lst-kix_3mekn7i9tqyg-5>li:before{content:"\0025a0  "}.lst-kix_3mekn7i9tqyg-6>li:before{content:"\0025cf  "}ul.lst-kix_f9srltrb74ot-4{list-style-type:none}ul.lst-kix_f9srltrb74ot-1{list-style-type:none}ul.lst-kix_f9srltrb74ot-2{list-style-type:none}ul.lst-kix_f9srltrb74ot-7{list-style-type:none}.lst-kix_3mekn7i9tqyg-0>li:before{content:"\0025cf  "}ul.lst-kix_f9srltrb74ot-8{list-style-type:none}ul.lst-kix_f9srltrb74ot-5{list-style-type:none}ul.lst-kix_f9srltrb74ot-6{list-style-type:none}.lst-kix_jcuik66chbv9-0>li:before{content:"\0025cf  "}ul.lst-kix_gwuc1w3b5m0s-6{list-style-type:none}.lst-kix_3mekn7i9tqyg-3>li:before{content:"\0025cf  "}.lst-kix_jcuik66chbv9-1>li:before{content:"\0025cb  "}.lst-kix_jcuik66chbv9-2>li:before{content:"\0025a0  "}ul.lst-kix_gwuc1w3b5m0s-5{list-style-type:none}.lst-kix_km6g891sw9fl-1>li:before{content:"\0025cb  "}ul.lst-kix_gwuc1w3b5m0s-4{list-style-type:none}ul.lst-kix_gwuc1w3b5m0s-3{list-style-type:none}.lst-kix_km6g891sw9fl-0>li:before{content:"\0025cf  "}.lst-kix_3mekn7i9tqyg-1>li:before{content:"\0025cb  "}.lst-kix_3mekn7i9tqyg-2>li:before{content:"\0025a0  "}ul.lst-kix_gwuc1w3b5m0s-8{list-style-type:none}ul.lst-kix_gwuc1w3b5m0s-7{list-style-type:none}.lst-kix_wfjgsg7y1pv8-0>li:before{content:"\0025cf  "}ul.lst-kix_km6g891sw9fl-4{list-style-type:none}.lst-kix_km6g891sw9fl-6>li:before{content:"\0025cf  "}ul.lst-kix_km6g891sw9fl-3{list-style-type:none}.lst-kix_km6g891sw9fl-5>li:before{content:"\0025a0  "}ul.lst-kix_km6g891sw9fl-6{list-style-type:none}.lst-kix_km6g891sw9fl-7>li:before{content:"\0025cb  "}ul.lst-kix_km6g891sw9fl-5{list-style-type:none}ul.lst-kix_km6g891sw9fl-8{list-style-type:none}ul.lst-kix_km6g891sw9fl-7{list-style-type:none}.lst-kix_km6g891sw9fl-8>li:before{content:"\0025a0  "}.lst-kix_wfjgsg7y1pv8-6>li:before{content:"\0025cf  "}.lst-kix_wfjgsg7y1pv8-8>li:before{content:"\0025a0  "}.lst-kix_wfjgsg7y1pv8-7>li:before{content:"\0025cb  "}.lst-kix_wfjgsg7y1pv8-2>li:before{content:"\0025a0  "}.lst-kix_wfjgsg7y1pv8-1>li:before{content:"\0025cb  "}.lst-kix_wfjgsg7y1pv8-5>li:before{content:"\0025a0  "}.lst-kix_wfjgsg7y1pv8-4>li:before{content:"\0025cb  "}.lst-kix_wfjgsg7y1pv8-3>li:before{content:"\0025cf  "}ul.lst-kix_3mekn7i9tqyg-7{list-style-type:none}ul.lst-kix_3mekn7i9tqyg-8{list-style-type:none}ul.lst-kix_3mekn7i9tqyg-5{list-style-type:none}ul.lst-kix_3mekn7i9tqyg-6{list-style-type:none}ul.lst-kix_3mekn7i9tqyg-0{list-style-type:none}.lst-kix_q8k8v6dcl5kh-6>li:before{content:"\0025cf  "}ul.lst-kix_3mekn7i9tqyg-3{list-style-type:none}ul.lst-kix_3mekn7i9tqyg-4{list-style-type:none}.lst-kix_q8k8v6dcl5kh-5>li:before{content:"\0025a0  "}ul.lst-kix_3mekn7i9tqyg-1{list-style-type:none}ul.lst-kix_3mekn7i9tqyg-2{list-style-type:none}.lst-kix_3dfdewudjmsj-6>li:before{content:"\0025cf  "}.lst-kix_q8k8v6dcl5kh-7>li:before{content:"\0025cb  "}ul.lst-kix_q8k8v6dcl5kh-7{list-style-type:none}.lst-kix_q8k8v6dcl5kh-8>li:before{content:"\0025a0  "}ul.lst-kix_q8k8v6dcl5kh-6{list-style-type:none}.lst-kix_3dfdewudjmsj-7>li:before{content:"\0025cb  "}.lst-kix_3dfdewudjmsj-8>li:before{content:"\0025a0  "}ul.lst-kix_q8k8v6dcl5kh-5{list-style-type:none}.lst-kix_gwuc1w3b5m0s-1>li:before{content:"\0025cb  "}ul.lst-kix_q8k8v6dcl5kh-4{list-style-type:none}ul.lst-kix_q8k8v6dcl5kh-3{list-style-type:none}.lst-kix_gwuc1w3b5m0s-0>li:before{content:"\0025cf  "}ul.lst-kix_q8k8v6dcl5kh-2{list-style-type:none}ul.lst-kix_q8k8v6dcl5kh-1{list-style-type:none}ul.lst-kix_q8k8v6dcl5kh-0{list-style-type:none}.lst-kix_f9srltrb74ot-8>li:before{content:"\0025a0  "}ul.lst-kix_q8k8v6dcl5kh-8{list-style-type:none}.lst-kix_3dfdewudjmsj-5>li:before{content:"\0025a0  "}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_q8k8v6dcl5kh-4>li:before{content:"\0025cb  "}.lst-kix_3dfdewudjmsj-3>li:before{content:"\0025cf  "}.lst-kix_3dfdewudjmsj-4>li:before{content:"\0025cb  "}ul.lst-kix_jcuik66chbv9-7{list-style-type:none}ul.lst-kix_jcuik66chbv9-8{list-style-type:none}.lst-kix_3dfdewudjmsj-2>li:before{content:"\0025a0  "}.lst-kix_q8k8v6dcl5kh-3>li:before{content:"\0025cf  "}ul.lst-kix_jcuik66chbv9-3{list-style-type:none}.lst-kix_q8k8v6dcl5kh-0>li:before{content:"\0025cf  "}.lst-kix_q8k8v6dcl5kh-1>li:before{content:"\0025cb  "}ul.lst-kix_jcuik66chbv9-4{list-style-type:none}.lst-kix_3dfdewudjmsj-0>li:before{content:"\0025cf  "}ul.lst-kix_jcuik66chbv9-5{list-style-type:none}ul.lst-kix_jcuik66chbv9-6{list-style-type:none}.lst-kix_q8k8v6dcl5kh-2>li:before{content:"\0025a0  "}ul.lst-kix_jcuik66chbv9-0{list-style-type:none}.lst-kix_3dfdewudjmsj-1>li:before{content:"\0025cb  "}ul.lst-kix_jcuik66chbv9-1{list-style-type:none}ul.lst-kix_jcuik66chbv9-2{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c1{margin-left:36pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c11{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left;height:11pt}.c9{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c0{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c8{color:#434343;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:14pt;font-family:"Arial";font-style:normal}.c5{padding-top:16pt;padding-bottom:4pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c7{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c3{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c4{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;text-decoration:underline}.c10{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c6{color:inherit;text-decoration:inherit}.c2{padding:0;margin:0}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c10"><h2 class="c9" id="h.2as143wqhfu6"><span class="c7">Participants</span></h2><ul class="c2 lst-kix_f9srltrb74ot-0 start"><li class="c1 li-bullet-0"><span class="c0">Yoav Weiss, Nic Jansma, Alex Christensen, Nicol&aacute;s Pe&ntilde;a Moreno, Carine Bournez, Patrick Hamann, Sean Feng, Michelle Vu, Noam Helfman, Hongbo Song, Annie Sullivan, Giacomo Zecchini, Steven Bougon, Benjamin De Kosnik</span></li></ul><h2 class="c9" id="h.r7u4w05x7s9g"><span class="c7">Next Meeting</span></h2><ul class="c2 lst-kix_gwuc1w3b5m0s-0 start"><li class="c1 li-bullet-0"><span class="c0">June 10th 10am PST / 1pm EST</span></li></ul><h2 class="c9" id="h.vxg9m2m3aulf"><span class="c7">Minutes</span></h2><ul class="c2 lst-kix_q8k8v6dcl5kh-0 start"><li class="c1 li-bullet-0"><span class="c0">Presentation will be recorded, but discussion afterwards will not be</span></li></ul><p class="c11"><span class="c0"></span></p><h3 class="c5" id="h.tfkfjatmckaa"><span class="c3"><a class="c6" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/1BPLovkf3scWzY68yamHIHWUX4jZ1WRZNTKFlhK0gE5M/&amp;sa=D&amp;source=editors&amp;ust=1623838462550000&amp;usg=AOvVaw0wxlacdqpzz0vNLYsP9R8Y">Web Perf APIs for responsiveness</a></span><span class="c8">&nbsp;- Nicol&aacute;s</span></h3><ul class="c2 lst-kix_km6g891sw9fl-0 start"><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: Goals: assess responsiveness of a webpage</span></li><li class="c1 li-bullet-0"><span class="c0">... Current metric used in CWV: FID</span></li><li class="c1 li-bullet-0"><span class="c0">... Problems: Only captures the first input, not interactions after the first one</span></li><li class="c1 li-bullet-0"><span class="c0">... Only looks at input delay, not how long it takes for input to be processed</span></li><li class="c1 li-bullet-0"><span class="c0">... Does not measure scrolling at all</span></li><li class="c1 li-bullet-0"><span>... Using an Event's </span><span class="c4">duration</span><span class="c0">, as part of PerformanceEventTiming interface</span></li><li class="c1 li-bullet-0"><span class="c0">... Delta between event timeStamp to the next rendering update after event handlers have run (after event has been dispatched), from the beginning till the first yellow star</span></li><li class="c1 li-bullet-0"><span>&nbsp;</span><span style="overflow: hidden;<b> display</b><b></b>: inline-block;<b> margin</b><b></b>: 0.00px 0.00px;<b> border</b><b></b>: 0.00px solid #000000;<b> transform</b><b></b>: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);<b> width</b><b></b>: 624.00px;<b> height</b><b></b>: 350.67px;"><img alt="" src="./WebPerfWG call - May 27th 2021_files/Screen Shot 2021-06-16 at 11.07.22.png" style="width: 624.00px;<b> height</b><b></b>: 350.67px; margin-left: 0.00px; margin-top: 0.00px;<b> transform</b><b></b>: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></li><li class="c1 li-bullet-0"><span class="c0">... Capturing async work is difficult, so now focusing on event duration, which is the minimal duration it’d take for users to see a response</span></li><li class="c1 li-bullet-0"><span class="c0">... How can we aggregate events across the page?</span></li><li class="c1 li-bullet-0"><span class="c0">… different number of events depending on the interaction</span></li><li class="c1 li-bullet-0"><span class="c0">... Aggregation by considering all events equal does not make sense, keyboard keydown/press/up are part of the same interaction</span></li><li class="c1 li-bullet-0"><span class="c0">... Clicks/taps have more events associated with them but they're a single user interaction</span></li><li class="c1 li-bullet-0"><span class="c0">... We want to consider tap/keyboard to be equally weighted</span></li><li class="c1 li-bullet-0"><span class="c0">... Measure something that is user perceptible, which is not individual DOM events but the actual interaction they did</span></li><li class="c1 li-bullet-0"><span class="c0">... Look at the user interactions themselves</span></li><li class="c1 li-bullet-0"><span class="c0">... Could also be a drag event</span></li><li class="c1 li-bullet-0"><span>... For these interactions we'd like to find something similar to </span><span class="c4">duration</span><span class="c0">&nbsp;but they're not events, so we need to define something about how long they take</span></li><li class="c1 li-bullet-0"><span>... For these slides, I'm calling them </span><span class="c4">latency</span></li><li class="c1 li-bullet-0"><span class="c0">... One option: Use maximum duration of any associated event</span></li><li class="c1 li-bullet-0"><span class="c0">... Other option: Use non-overlapping sum of durations of events</span></li><li class="c1 li-bullet-0"><span class="c0">... Example from pressing key and releasing it</span></li><li class="c1 li-bullet-0"><span style="overflow: hidden;<b> display</b><b></b>: inline-block;<b> margin</b><b></b>: 0.00px 0.00px;<b> border</b><b></b>: 0.00px solid #000000;<b> transform</b><b></b>: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);<b> width</b><b></b>: 624.00px;<b> height</b><b></b>: 350.67px;"><img alt="" src="./WebPerfWG call - May 27th 2021_files/Screen Shot 2021-06-16 at 11.11.47.png" style="width: 624.00px;<b> height</b><b></b>: 350.67px; margin-left: 0.00px; margin-top: 0.00px;<b> transform</b><b></b>: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></li><li class="c1 li-bullet-0"><span class="c0">... Key press takes more than a single frame</span></li><li class="c1 li-bullet-0"><span class="c0">... In this case key down duration is separate from key up duration (non-overlapping)</span></li><li class="c1 li-bullet-0"><span class="c0">... How can a web developer calculate this right now?</span></li><li class="c1 li-bullet-0"><span class="c0">... Problems for a web developer: We have a minimum duration threshold (e.g. 16ms), where anything less is not surfaced to the API</span></li><li class="c1 li-bullet-0"><span class="c0">... Would have to use event counts somehow to count those properly</span></li><li class="c1 li-bullet-0"><span class="c0">... Only receiving DOM events you got, you'd have to match/group into interactions they correspond to</span></li><li class="c1 li-bullet-0"><span class="c0">... Can try to do this via event timestamps, but this is not an easy process</span></li><li class="c1 li-bullet-0"><span class="c0">... Proposing interactionID, a new attribute for interface where it has an ID that is shared across corresponding entries from the same interaction</span></li><li class="c1 li-bullet-0"><span class="c0">... Other issue is measuring scrolling</span></li><li class="c1 li-bullet-0"><span class="c0">... We want to include scroll latency</span></li><li class="c1 li-bullet-0"><span class="c0">... Latency is just the scroll update, from trigger of scroll to first render after that</span></li><li class="c1 li-bullet-0"><span class="c0">... No real DOM events associated with this latency</span></li><li class="c1 li-bullet-0"><span class="c0">... Scroll can be performed without going to JavaScript thread so it's not blocked on DOM handlers</span></li><li class="c1 li-bullet-0"><span class="c0">... For WebPerf APIs, we'd need scroll latency</span></li><li class="c1 li-bullet-0"><span class="c0">... Options: Have a new PerformanceEventTiming entry with a name equal to 'scroll' or 'scrollBegin' (name right now is event type)</span></li><li class="c1 li-bullet-0"><span class="c0">... Other option is have a new Scroll Timing API where we expose the latency we want</span></li><li class="c1 li-bullet-0"><span class="c0">... Benefit of another API is it could be nicer to augment in the future</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b><b></b>: Looking for opinions on API shape for scrolls?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: Two questions would be thoughts on scrolling, and thoughts on EventTiming threshold/interactionID</span></li><li class="c1 li-bullet-0"><span class="c0">... Worry with changing minimum duration threshold is that it could become too noisy</span></li><li class="c1 li-bullet-0"><span class="c0">... Would offer enabling filtering by event type, which would save developer time and would be better for performance</span></li><li class="c1 li-bullet-0"><span class="c0">… Avoid getting callbacks for entries you don’t care about</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Nic</b><b></b>: Any other observer APIs that allow you to pre-filter or specify a filter?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: I don’t think we do</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Nic</b><b></b>: So you’d need to specify the event types?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: Yeah, in the observe call. We already have duration to query only for durations you care about. Would that be confusing?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Nic</b><b></b>: No, was just looking for precedents. Seems reasonable.</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: We know that this is important for long tasks, so that kind of filtering may be useful for other entry types. And we do have the observer dictionary where we could set the types</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b><b></b>: Been using Event Timing for a few months now, and never needed event duration smaller than 100ms, but never dealt with grouping of related events. My intention was to minimize the number of events and 100ms was good enough for that - just filter all events below that. But I like the idea of interaction ID for grouping</span></li><li class="c1 li-bullet-0"><span class="c0">… Why do we need to capture all events? What’s the use case?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: the idea is: if you’re tapping on a website, developer can perform the work in any of the events that are being dispatched. The idea is to help with the metric being agnostic to the way the site is implemented. </span></li><li class="c1 li-bullet-0"><span class="c0">… FID looks at the first discrete interaction with the page, which is probably meaningful. So it doesn’t include hover events, as they are not typically meaningful. </span></li><li class="c1 li-bullet-0"><span class="c0">… It’s with that constraint that we want to measure interactivity, where we think an interaction ID can be meaningful</span></li><li class="c1 li-bullet-0"><span class="c0">… Grouping by interaction ID can help RUM providers</span></li><li class="c1 li-bullet-0"><span class="c0">... Noam: But why smaller durations?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: Events not present would have a duration of zero</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b><b></b>: The challenge - if not all events are captured because of the duration threshold (missing all events below that), if we want to calculate the percentage of the responsive events, you can’t really do that. Do you calculate the relative percentiles - if you dropped 90% of the events, you can calculate the 95 %ile by finding the p50 of the captured events. We can count the totals from the event handler</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: Makes sense. Another use case for the minimum duration - if you want to compute FID from BFCache, whatever you get is not guaranteed to be the first, as events could’ve been dropped. But it may not be related to the discussion.</span></li><li class="c1 li-bullet-0"><span class="c0">… Other ways to solve this is just firing the first input. So no minimum duration makes sense</span></li><li class="c1 li-bullet-0"><span class="c0">Sean:Like the idea of interactionID, but do we really need to expose it? If we see the key down, is that not enough? What’s the use case of calculating latency and grouping the events together?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: The use case is focused on analytics and browser metrics - analytics provider wants to provide data on the site without having control over the content. If you have no control over the content and still make sense of event timing data, this can help you aggregate entries together.</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Annie</b><b></b>: Metrics try to measure what the user is experiencing - interaction ID brings us closer to the user experience</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Sean</b><b></b>: If you know that key down is slow, you’d still be able to tell</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Annie</b><b></b>: You’d need to understand what the page is doing, which is not always true</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b><b></b>: question regarding scrolling - we correlate event handlers based on the event timestamps and event timing timestamps and figure out what the user did. I’m trying to think how that would work for scroll. The timestamp on the scroll event won’t match any event timestamp.</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: The timestamp we’d use for scroll latency would be something like a mouse move, which is not exposed in event timing</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b><b></b>: But there’s also mouse wheel, touch, etc. </span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: yeah, and the scroll event cannot be used because it’s dispatched later</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b><b></b>: So how so we correlate between the event timing entry and the operation the user did? We can expose the target so we know which dom element was scrolled on, but e.g. I wouldn’t know if it’s a horizontal/vertical scroll. Need a way to correlate between what happened and the event timing entry</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: sounds like you’re arguing for the second option, because you’d need extra information</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b><b></b>: I would need extra information on the scroll event. Maybe we need a scroll ID? It’s another correlation problem similar to the interaction ID</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: not entirely sure</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Alex</b><b></b>: What exactly do you want to measure when measuring scroll timing? It’s simple for mousewheel/click where you have a single event. But the world has changed and we have continuous scrolling and you can have events that can cause you to scroll up and down for ~10 seconds. What would we measure?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: The initial scroll latency. The first frame that the scroll initiated.</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Alex</b><b></b>: makes sense. It’s a complicated problem with many moving parts, threads, etc</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: yeah. Which makes Noam’s question even more interesting</span></li><li class="c1 li-bullet-0"><span class="c0">… In terms of making sense of later data - what happens with other scroll updates? We don’t currently look into that, but it may be interesting to developers. If we’d expose it, it’d need to follow a similar shape of what we ship here. It’d need to fit the mold of event timing</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Nic</b><b></b>: You had 3 challenges, one of them was around measuring async work. Any of the work here would help with that?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: We think it’d be hard to come up with heuristics that measure the work we want to measure. There’s work posted from the event handler, using setTimeout, etc. We’re interested in exploring the problem, but haven’t made progress there</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b><b></b>: For the scroll timing API, it sounds like the feedback was for a separate Scroll Timing API</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: I would like to hear feedback from any other vendor or implementor</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b><b></b>: InteractionID could help capture and correlate between scroll events and handlers</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b><b></b>: You could do that with a passive scroll event that gives you a target on which the scroll happens</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b><b></b>: Right now we can use target or event timestamp, but today for scroll we don't have any options</span></li></ul><h3 class="c5" id="h.aug387vy4mrd"><span class="c3"><a class="c6" href="https://www.google.com/url?q=https://bugs.webkit.org/show_bug.cgi?id%3D225733&amp;sa=D&amp;source=editors&amp;ust=1623838462565000&amp;usg=AOvVaw1ejp-dH7C7iyLSy-Oiwchy">https://bugs.webkit.org/show_bug.cgi?id=225733</a></span><span class="c8">&nbsp;spec clarification</span></h3><ul class="c2 lst-kix_3dfdewudjmsj-0 start"><li class="c1 li-bullet-0"><span class="c0"><b>Nic</b><b></b>: an issue with webkit specifically around TLS connection reuse and the connectionStart being 0 in that case. This case needs to be clarified that secureConnectionStart needs to be equal to fetchStart only in the HTTPS case. So we’re returning 0 in a reused connection that has TLS, but it’s fetchStart without TLS.</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b><b></b>: Current definition is in Fetch, and is doing something else than what implementations are doing</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: should we change the spec or change the implementation?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Alex</b><b></b>: just aligned to the current behavior, so prefer to fix the spec</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b><b></b>: current behavior gives us info on whether a secure connection was used</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Nic</b><b></b>: Can take an action time to file an issue</span></li><li class="c1 li-bullet-0"><span class="c0"><b>nicol&aacute;s</b><b></b>: when did we get 58 open issues on RT?</span></li></ul><h3 class="c5" id="h.mlrb123r3om5"><span class="c3"><a class="c6" href="https://www.google.com/url?q=https://github.com/whatwg/fetch/issues/1215&amp;sa=D&amp;source=editors&amp;ust=1623838462567000&amp;usg=AOvVaw2bTMsfuWHfs_2PbLjjcxii">https://github.com/whatwg/fetch/issues/1215</a></span><span class="c8">&nbsp;</span></h3><ul class="c2 lst-kix_3mekn7i9tqyg-0 start"><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b><b></b>: ideal answer: none?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Nic</b><b></b>: There’s a middleground answer of exposing them as if they are cross origin resources with no TAO</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Alex</b><b></b>: Remember needing to add all HTTP status code to this, and now there are more errors. There’s a lot that can go wrong: DNS, TLS, &nbsp;certs. Do you want to allow visibility into this?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Nic</b><b></b>: Today we have visibility into DNS, TCP and TLS errors</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b><b></b>: what about overlap with NEL? Would NEL be sufficient? </span></li><li class="c1 li-bullet-0"><span class="c0"><b>Nic</b><b></b>: NEL is hard to tie back to the original session. Would be preferable from an analytics perspective to have them be part of RUM, rather than a scrubbed report later</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b><b></b>: Over time, let’s continue the discussion on the issue and on the next call in a couple of weeks</span></li></ul></div></div><div id="footer"><span> <a target="_blank" title="Learn more about " href="https://docs.google.com/"></a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjowN_hQaceXpdf6NF5nE1j-wbmmqJxd1L6E12Gympu3Dm9tCRcEjEbeFXFRxLiFqYB75OlPPanrznzELR1A:0"></a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};
function ca(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var da=ca(this);function ea(a,b){if(b)a:{var c=da;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&ba(c,a,{configurable:!0,writable:!0,value:b})}}var h;
if("function"==typeof Object.setPrototypeOf)h=Object.setPrototypeOf;else{var l;a:{var fa={a:!0},ha={};try{ha.__proto__=fa;l=ha.a;break a}catch(a){}l=!1}h=l?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ia=h;
function m(a,b){a.prototype=aa(b.prototype);a.prototype.constructor=a;if(ia)ia(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.m=b.prototype}ea("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var q=this||self;function r(){}function t(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function ja(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function ka(a,b){function c(){}c.prototype=b.prototype;a.m=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.A=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function u(a){return a};function w(a){w[" "](a);return a}w[" "]=r;function la(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};function ma(a){return la(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++na}}})}var na=1E3;function x(){}x.prototype.s=function(){return this.j||(Object.defineProperties(this,{j:{value:oa=oa+1|0,enumerable:!1}}),this.j)};x.prototype.toString=function(){var a=y(z(pa(this.constructor)))+"@";var b=(this.s()>>>0).toString(16);return a+y(b)};function A(){}m(A,x);A.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.v=this}catch(b){}};function qa(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}A.prototype.toString=function(){var a=z(pa(this.constructor)),b=this.l;return null==b?a:y(a)+": "+y(b)};function B(){}m(B,A);function D(){}m(D,B);function E(){}m(E,D);E.prototype.i=function(a){D.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function ra(){}m(ra,E);var oa=0;function sa(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function y(a){return null==a?"null":a.toString()}function ta(a){return 65536<=a?y(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+y(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function ua(a,b){var c=b,d=a.length,e;b=sa(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=sa(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function F(a,b){this.g=a;this.h=b}m(F,x);function z(a){if(0!=a.h){var b="L"+y(ma(a.g))+";";a=a.h;for(var c="",d=0;d<a;d=d+1|0)c=y(c)+"[";return y(c)+y(b)}return ma(a.g)}F.prototype.toString=function(){return"class "+y(z(this))};function pa(a){return la(a.prototype,"$$class/0",function(){return new F(a,0)})};function G(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var va=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function wa(a){a=va.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function xa(a,b){var c=a.indexOf(ta(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=ua(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=ua(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(ta(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=y(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+y(c.substr(e))):
(d=y(c.substr(0,b|0)),e=b=b+1|0,c=d+y(c.substr(e)));a=a.replace(/\+/g,c);return G(a,!1)};function ya(a){a&&"function"==typeof a.u&&a.u()};function H(){this.h=this.h;this.g=this.g}H.prototype.h=!1;H.prototype.u=function(){this.h||(this.h=!0,this.j())};H.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var za=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};var Aa=/&/g,Ba=/</g,Ca=/>/g,Da=/"/g,Ea=/'/g,Fa=/\x00/g,Ga=/[\x00&<>"']/;var I;a:{var Ha=q.navigator;if(Ha){var Ia=Ha.userAgent;if(Ia){I=Ia;break a}}I=""}function J(a){return-1!=I.indexOf(a)};function Ja(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var K;function L(a,b){this.i=a===Ka&&b||"";this.j=La}L.prototype.h=!0;L.prototype.g=function(){return this.i};var La={},Ka={};function M(a,b){this.i=b===N?a:""}M.prototype.h=!0;M.prototype.g=function(){return this.i.toString()};M.prototype.toString=function(){return this.i.toString()};function O(a){return a instanceof M&&a.constructor===M?a.i:"type_error:SafeUrl"}
var Ma=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Na=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Oa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Pa(a){if(a instanceof M)return a;a="object"==typeof a&&a.h?a.g():String(a);Oa.test(a)||(a="about:invalid#zClosurez");return new M(a,N)}
var N={},Qa=new M("about:invalid#zClosurez",N);function P(a,b,c){this.i=c===Ra?a:""}P.prototype.h=!0;P.prototype.g=function(){return this.i.toString()};P.prototype.toString=function(){return this.i.toString()};var Ra={};function Sa(a,b,c,d){a=a instanceof M?a:Pa(a);b=b||q;c=c instanceof L?c instanceof L&&c.constructor===L&&c.j===La?c.i:"type_error:Const":c||"";return void 0!==d?b.open(O(a),c,d,void 0):b.open(O(a),c)};var Ta=J("Trident")||J("MSIE"),Ua=J("Edge")||Ta,Va=J("Gecko")&&!(-1!=I.toLowerCase().indexOf("webkit")&&!J("Edge"))&&!(J("Trident")||J("MSIE"))&&!J("Edge"),Wa=J("Macintosh");var Xa=function(){if(!q.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{q.addEventListener("test",r,b),q.removeEventListener("test",r,b)}catch(c){}return a}();function Q(a,b){this.type=a;this.target=b;this.i=!1}Q.prototype.g=function(){this.i=!0};function R(a){Q.call(this,a?a.type:"");this.relatedTarget=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.h=null;if(a){var b=this.type=a.type,c=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;var d=a.relatedTarget;if(d){if(Va){a:{try{w(d.nodeName);var e=!0;break a}catch(f){}e=!1}e||(d=null)}}else"mouseover"==
b?d=a.fromElement:"mouseout"==b&&(d=a.toElement);this.relatedTarget=d;c?(this.clientX=void 0!==c.clientX?c.clientX:c.pageX,this.clientY=void 0!==c.clientY?c.clientY:c.pageY,this.screenX=c.screenX||0,this.screenY=c.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=
a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Ya[a.pointerType]||"";this.state=a.state;this.h=a;a.defaultPrevented&&R.m.g.call(this)}}ka(R,Q);var Ya={2:"touch",3:"pen",4:"mouse"};R.prototype.g=function(){R.m.g.call(this);var a=this.h;a.preventDefault?a.preventDefault():a.returnValue=!1};var S="closure_listenable_"+(1E6*Math.random()|0);var Za=0;function $a(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.i=e;this.key=++Za;this.h=this.o=!1}function ab(a){a.h=!0;a.listener=null;a.g=null;a.src=null;a.i=null};function T(a){this.src=a;this.g={};this.h=0}T.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.h&&k.listener==b&&k.capture==!!d&&k.i==e)break a}g=-1}-1<g?(b=a[g],c||(b.o=!1)):(b=new $a(b,this.src,f,!!d,e),b.o=c,a.push(b));return b};var U="closure_lm_"+(1E6*Math.random()|0),V={},bb=0;function cb(a,b,c,d,e){if(d&&d.once)return db(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)cb(a,b[f],c,d,e);return null}c=eb(c);return a&&a[S]?a.g(b,c,t(d)?!!d.capture:!!d,e):fb(a,b,c,!1,d,e)}
function fb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=t(e)?!!e.capture:!!e,k=gb(a);k||(a[U]=k=new T(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=hb();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Xa||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(ib(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");bb++;return c}
function hb(){function a(c){return b.call(a.src,a.listener,c)}var b=jb;return a}function db(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)db(a,b[f],c,d,e);return null}c=eb(c);return a&&a[S]?a.h(b,c,t(d)?!!d.capture:!!d,e):fb(a,b,c,!0,d,e)}
function kb(a){if("number"!==typeof a&&a&&!a.h){var b=a.src;if(b&&b[S])b.i(a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(ib(c),d):b.addListener&&b.removeListener&&b.removeListener(d);bb--;if(c=gb(b)){d=a.type;if(d in c.g){var e=c.g[d],f=za(e,a),g;(g=0<=f)&&Array.prototype.splice.call(e,f,1);g&&(ab(a),0==c.g[d].length&&(delete c.g[d],c.h--))}0==c.h&&(c.src=null,b[U]=null)}else ab(a)}}}
function ib(a){return a in V?V[a]:V[a]="on"+a}function jb(a,b){if(a.h)a=!0;else{b=new R(b,this);var c=a.listener,d=a.i||a.src;a.o&&kb(a);a=c.call(d,b)}return a}function gb(a){a=a[U];return a instanceof T?a:null}var lb="__closure_events_fn_"+(1E9*Math.random()>>>0);function eb(a){if("function"===typeof a)return a;a[lb]||(a[lb]=function(b){return a.handleEvent(b)});return a[lb]};function W(a){H.call(this);this.l=a;this.i={}}ka(W,H);var mb=[];function nb(a){Ja(a.i,function(b,c){this.i.hasOwnProperty(c)&&kb(b)},a);a.i={}}W.prototype.j=function(){W.m.j.call(this);nb(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function ob(a){H.call(this);this.i=a||document.body;this.l=new W(this);a=ja(ya,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.s,d="click";Array.isArray(d)||(d&&(mb[0]=d.toString()),d=mb);for(var e=0;e<d.length;e++){var f=cb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}m(ob,H);
ob.prototype.s=function(a){if(!(0!=a.h.button||Wa&&a.ctrlKey||a.i))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=wa(c),f;if(f="www.google.com"===G(e[3],!0)){var g=wa(c);f="/url"===G(g[5],!0)}if(f){var k=xa(c,"q");d=k?k:xa(c,"url")}}catch(v){a:{var p=v;if(null!=p){var n=p.v;if(null!=n){v=n;break a}}if(p instanceof TypeError){var C=n=new ra;C.l=y(p);qa(C);n.g="__noinit__";
n.g=p;n.i(new TypeError(n));p=n}else C=n=new E,C.l=y(p),qa(C),n.g="__noinit__",n.g=p,n.i(Error(n)),p=n;v=p}if(!(v instanceof B))throw v.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof M?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof M||(f="object"==typeof f&&f.h?f.g():String(f),Oa.test(f)?f=new M(f,N):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Na))&&Ma.test(g[1])?new M(f,N):null)),f=f||Qa);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+
"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((J("iPhone")&&!J("iPod")&&!J("iPad")||J("iPad")||J("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof M?f:Pa(f),g.href=O(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",
!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=Sa("",c,d,e),b=O(f),c){Ua&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ga.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(Aa,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(Ba,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(Ca,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(Da,"&quot;")),-1!=b.indexOf("'")&&(b=b.replace(Ea,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Fa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+
b+'">';if(void 0===K)if(d=null,(e=q.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:u,createScript:u,createScriptURL:u})}catch(v){q.console&&q.console.error(v.message)}K=d}else K=d;b=(d=K)?d.createHTML(b):b;b=new P(b,null,Ra);(c=c.document)&&c.write&&(c.write(b instanceof P&&b.constructor===P?b.i:"type_error:SafeHtml"),c.close())}}else(c=Sa(f,c,d,e))&&b.noopener&&(c.opener=null);a.g();break}}b=b.parentNode}};function pb(a){new ob(a)}
var X=["DOCS_installLinkReferrerSanitizer"],Y=q;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===pb?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=pb;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>